#ifndef _VL_RTSP_UDP_DISPATCHER__H_
#define _VL_RTSP_UDP_DISPATCHER__H_

#include "defs.h"
#include "media_dispatcher.h"
#include "utils/queue_thread.h"
#include "utils/udpsocket.h"

namespace VLRTSP {
	
class UDPDispatcher: public MediaDispatcher {
public:
	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-14 11:45:35
	 * 
	 * 构造函数
 	 * @param ip 客户端 IP 地址
 	 * @param id 媒体分发器 Id
	 * @param rtpSendPoint RTP 发送端口 / Channel
	 * @param rtcpSendPoint RTCP 发送端口 / Channel
	 * @param mediaSource 媒体资源
	 */
	explicit UDPDispatcher(
		std::string ip,
		uint32_t id,
		uint32_t rtpSendPoint,
		uint32_t rtcpSendPoint,
		std::shared_ptr<MediaSource> mediaSource
	);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-14 11:46:07
	 * 
	 * 析构函数
	 */
	~UDPDispatcher();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-14 16:53:06
	 * 
	 * 初始化数据分发器
	 * @return 如果初始化成功返回 true
	 */
	virtual bool init();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-14 17:00:32
	 * 
	 * 获取服务端 RTP 端口号
	 * @return 服务端 RTP 端口号
	 */
	uint16_t getServerRTPPort();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-14 17:00:51
	 * 
	 * 获取服务器 RTCP 端口号
	 * @return 服务器 RTCP 端口号
	 */
	uint16_t getServerRTCPPort();


protected:

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-14 11:43:10
	 * 
	 * 消息队列回调函数
	 * @param sendBuffer 待发送的 RTP 帧
	 */
	virtual void onRecvSendBuffer(std::shared_ptr<RTPFrame>& sendBuffer);

private:

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-14 20:02:44
	 * 
	 * 客户端 IP 地址
	 */
	std::string ip;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-14 16:51:34
	 * 
	 * RTP 发送套接字
	 */
	UDPSocket rtpSocket;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-14 16:52:24
	 * 
	 * RTCP 发送套接字
	 */
	UDPSocket rtcpSocket;
};

} // namespace VLRTSP



#endif //_VL_RTSP_UDP_DISPATCHER__H_
